/**************************************************************************
 *** 程序作者 : 徐建宇                                                   ***
 *** 日    期 : 2016-07-14                                               ***
 *** 所属模块 :                                                          ***
 *** 程序名称 : updatecli.c                                          	 ***
 *** 程序功能 : 系统更新文件客户端                                 	 ***
 *** 使用注意 :                                                          ***
 *** 修改记录 ：						       	 ***
 *** 日  期   :	  						       	 ***
 *** 修 改 人 :		     				    	         ***
 *** 修改内容 :							         ***
 ***************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include "pub_log.h"  
#include "sendrecv.h"

#define	SVRPORT (9527)                     
#define	SVRIP "192.168.2.129"                     


#define EXITMAIN() do{\
	close(clisock);\
	WrLog_release();\
	return -1;\
}while(0)

int send_msg(int sock, char type, char *data);

int main(int argc, char **argv )
{
	int iRc = 0, pid;
	int clisock, connfd;

	//日志模块初始化
	iRc = WrLog_init_by_logname_logpath("updatecli", "./");
	if(iRc < 0)
	{
		fprintf(stderr, "WrLog_init_by_logname_logpath() err!\n");
		return -1;
	}
	slog_debug("updatecli started.....");

	//客户端sock初始化
	iRc = client_init( &clisock, SVRIP, SVRPORT );
	if(iRc < 0)
	{
		slog_err("client_init() err! iRc = [%d] (error code: %d - %s)", iRc, errno, strerror(errno));
		EXITMAIN();
	}

	slog_info("connect access! sockfd = [%d]", clisock);

	//检查新版本
	if(check_newversion() < 0)
	{
		slog_err("check_newversion() err! (error code: %d - %s)", errno, strerror(errno));
		EXITMAIN();
	}

	//下载更新文件
	if(download_file(clisock) < 0)
	{
		slog_err("download_file() err! (error code: %d - %s)", errno, strerror(errno));
		EXITMAIN();	
	}

	//更新本地文件


	close(clisock);
	WrLog_release();
	return(0);
}
int check_newversion()
{
	slog_info("check_newversion begin ");
	return 0;
}
int send_msg(int sock, char type, char *data)
{
	char buf[MSGDATALEN + 2];
	memset(buf, 0x00, sizeof(buf));
	switch(type)
	{
		case U_CHECK:
			write(sock, "1", 1);
			break;
		case U_UPDATE:
			write(sock, "2", 1);
			break;
		case U_DOWNLOAD:
			sprintf(buf, "3%s", data);
			write(sock, buf, strlen(buf));
			break;
		case U_EXIT:
			write(sock, "4", 1);
			break;
		default:
			return -1;
			break;
	}
	return 0;
}
int client_init( int *client_sockfd, char *ip_str, int port_int )
{
	struct sockaddr_in server_addr;

	if( strlen(ip_str) < 8 ) {
		return -1;
	}

	// socket
	if( (*client_sockfd = socket( AF_INET, SOCK_STREAM, 0 )) == -1 )
	{
		return -2;
	}

	// addr
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons( port_int );
	server_addr.sin_addr.s_addr=inet_addr(ip_str);
	bzero( &(server_addr.sin_zero), 8 );

	// connect
	if( connect( *client_sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr) ) == -1 )
	{
		return -3;
	}

	return 0;
}
int download_file(int clisock)
{
	sfile_t sfile;
	char *readBuf = NULL;
	char rFileName[FILENAMELEN];
	char sBuf[MSGDATALEN];
	FILE *fp = NULL;

	readBuf = (char *)&sfile;
	//获取更新文件名
	if(send_msg(clisock, U_UPDATE, NULL) < 0)
	{
		slog_err("send_msg() err!");
		return -1;
	}
	memset(&sfile, 0x00, sizeof(sfile_t));
	readBuf = (char *)&sfile;
	if(cli_get_file(clisock) < 0)
	{
		slog_err("cli_get_file() err!");
		return -1;
	}

	//一次下载获取的文件
	memset(rFileName, 0x00, sizeof(rFileName));
	sprintf(rFileName, "%s%s", CLIENTFILEPATH, UPDATEINFO);
	if((fp = fopen(rFileName, "r"))==NULL)
	{
		slog_err("fopen() filename = [%s] err! (error code: %d - %s)", rFileName, errno, strerror(errno));
		return -1;
	}
	memset(sBuf,0x00,sizeof(sBuf));
	fgets(sBuf, sizeof(sBuf) - 1, fp);

	/*读取文件内容*/
	while( !feof(fp) )
	{
		*(sBuf + strlen(sBuf) -1) = '\0';
		str_trim(sBuf);	
		if(sBuf[0] == '\0' || sBuf[0] == '\n')			
		{
			memset(sBuf,0x00,sizeof(sBuf));
			fgets(sBuf, sizeof(sBuf) - 1, fp);
			continue;
		}
		if(send_msg(clisock, U_DOWNLOAD, sBuf) < 0)
		{
			slog_err("send_msg() err!");
			return -1;
		}
		if(cli_get_file(clisock) < 0)
		{
			slog_err("cli_get_file() err!");
			return -1;
		}	
		memset(sBuf,0x00,sizeof(sBuf));
		fgets(sBuf, sizeof(sBuf) - 1, fp);
	}
	fclose(fp);		

	return 0;
}
